home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / cmln0186.arc / CROSSTH1.LTG < prev    next >
Text File  |  1986-12-20  |  2KB  |  69 lines

  1.  
  2.                            Listing 1.  
  3.          PPL code for the concurrent Shell-Metzner sort.
  4.  
  5.  
  6. PROCEDURE ShellSort(List : array of your data; Num : integer)
  7.  
  8. -- Procedure to shell sort an array of List[]
  9. -- Num is the number of elements to be sorted
  10.  
  11. BEGIN
  12.    INITIALIZE: Offset = Num
  13.    LOOP <One>
  14.    BEGIN IF Offset <= 1 THEN EXIT <One> END IF
  15.      INITIALIZE: Offset /= 2 -- Integer division
  16.      LOOP <TWO>
  17.      BEGIN
  18.           INITIALIZE: InOrder = TRUE
  19.           LOOP <SWAP_CYCLE>
  20.           BEGIN For J = 1 to Num - Offset
  21.                I = J + Offset
  22.                -- Start concurrent procedure with priority J
  23.                -- Compare() will compare and swap elements if needed
  24.                -- setting InOrder = FALSE if elements were swapped
  25.                StartProcedure(Compare(List[J],List[J]),J,Signal[J])
  26.           END LOOP <SWAP_CYCLE>
  27.           TERMINATE: Wait for pending Signals
  28.           If InOrder THEN EXIT <TWO> END IF
  29.      END LOOP <TWO>
  30.      TERMINATE: None
  31.   END LOOP <ONE>
  32.   TERMINATE: None
  33. END ShellSort
  34.  
  35.  
  36.          PPL code for the concurrent list insertion-sort
  37.  
  38. PROCEDURE InsertSort(List : array[1..NumCPU] of array of your data;
  39.                      MoreData : array of your data;
  40.                      Ptr  : array of pointer to your data;
  41.                      NumInList, NumAdded, NumCPU  : integer)
  42.  
  43. -- NumCPU = number of CPUs and sub-lists
  44. -- NumInList = current list size
  45. -- NumAdded = number of added list elements
  46.  
  47. VAR Done : array[1..NumAdded] of boolean
  48.     BusyCPU : array[1..NumCPU] of boolean
  49.  
  50. BEGIN
  51.    INITIALIZE: Set elements of Done and BusyCPU arrays to FALSE
  52.                All_Done = FALSE; Priority = 1
  53.    LOOP <OUTER>
  54.    BEGIN IF All_Done THEN EXIT <OUTER> END IF
  55.       INITIALIZE: All_Done = TRUE
  56.       LOOP <INNER>
  57.       BEGIN For i = 1 to NumAdded
  58.          j = index of MoreData[i] from Search Table
  59.          IF Signal[j] THEN BusyCPU[j] = FALSE ELSE BusyCPU[j] = TRUE END
  60.          IF NOT BusyCPU[j]
  61.          THEN StartProcedure(Insert(MoreData[i],j),Priority,Signal[j])
  62.            Done[i] = TRUE;
  63.          ELSE All_Done = FALSE END IF
  64.       END LOOP <INNER>
  65.       TERMINATE: None
  66.    END LOOP <OUTER>
  67.    TERMINATE: None
  68. END InsertSort
  69.